package com.example.proxy.jdk_proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyFactory {

    private Object target;

    public ProxyFactory(Object target) {
        this.target = target;
    }

    public Object getProxyInstance() {

        return Proxy.newProxyInstance(
                //目标类使用的类加载器
                target.getClass().getClassLoader(),
                //目标对象实现的接口类型
                target.getClass().getInterfaces(),
                //事件处理器
                new InvocationHandler() {


                    /**
                     * invoke 方法参数说明
                     * @param proxy  代理对象
                     * @param method 对应于在代理对象上调用的接口方法 Method实例
                     * @param args    代理对象调用接口方法时传递的实际参数
                     * @return   返回目标对象方法的返回值,没有返回值就返回null
                     * @throws Throwable
                     */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("开始自行事务 ");
                        method.invoke(target, args);
                        System.out.println("开始提交事务");
                        return null;
                    }
                }
        );
    }


}
